<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.15">
<title>Remarks</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<!-- ************* Meta ************* -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />

<!-- ************* OpenGraph ************-->
<meta name="description" content="The Eclipse N4JS language and its IDE enable high-quality JavaScript development for large Node.js projects.">

<meta property="og:site_name" content="Eclipse N4JS"/>
<meta property="og:title" content="Eclipse N4JS Language and IDE"/>
<meta property="og:url" content="https://numberfour.github.io/n4js"/>
<meta property="og:description" content="The Eclipse N4JS language and its IDE enable high-quality JavaScript development for large Node.js projects."/>
<meta property="og:image" content="../images/n4js.png">

<!-- ************* Favicon ************-->
<link rel="icon" href="../images/favicon.ico" />
<link rel="icon" type="image/png" href="../images/favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="../images/favicon-16x16.png" sizes="16x16" />

<!-- ************* Back-to-top JQuery ************* -->
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>

<!-- ************* Prism.js Syntax Highlighter ******-->
<link href="../styles/prism.min.css" rel="stylesheet"/>
<script src="../scripts/prism.js"></script>

<!-- ************* Styles ************* -->

<link rel="stylesheet" type="text/css" href="../styles/n4js-adoc.css">

<!-- ****************** NavBar ****************** -->
<div id="menubar">
    <div class="banner">
        <a href="../index.html"><img id="logo" src="../images/n4js-logo.png" alt="Eclipse N4JS Language and IDE"></a>
    </div>
<ul>
  <li><a href="../downloads.html"></i>Download</a></li>
  <li><a href="../community.html"></i>Community</a></li>
  <li><a href="../userguides/index.html">Documentation</a></li>
</ul>
</div>
<button id="tocbutton">TOC</button>
</head>
<body class="book">
<div id="header">
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<h1 id="_eclipse_n4js_language_and_ide_features" class="discrete">Eclipse N4JS Language and IDE Features</h1>
<h2 id="_feature_table" class="discrete">Feature Table</h2>
<div class="paragraph">
<p>The following table gives an overview of features implemented by N4JS.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_remarks"><a class="link" href="#_remarks">Remarks</a></h2>
<div class="sectionbody">
<div id="remarks" class="ulist">
<ul>
<li>
<p>The parser fully supports ECMAScript 2015 syntax including unicode escape sequences, regular expressions and automatic semicolon insertion. Not all constructs are fully supported by the type-checker yet.</p>
</li>
<li>
<p>The transpiler translates N4JS to V8-compatible JavaScript. ES2015 constructs not supported by latest V8 are rejected by N4JS.</p>
</li>
<li>
<p>Except <code>project</code> (as an access modifier, will be removed in future versions as it is the default), N4JS does not introduce any new keywords to ECMAScript 2015/ES.next.
If additional functionality requires explicit declarations, this is done via annotations similar to Java (using <code>@</code>).
There are no user-defined annotations supported at the moment (this is why we do not list annotations as a feature).</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_feature_table_2"><a class="link" href="#_feature_table_2">Feature Table</a></h2>
<div class="sectionbody">
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_statements-and-expressions"></a> Statements and expressions</th>
</tr>
</thead>
<tbody>
<tr>
<th class="tableblock halign-center valign-top"><p class="tableblock">Feature</p></th>
<th class="tableblock halign-center valign-top"><p class="tableblock">Similar to</p></th>
<th class="tableblock halign-left valign-top"><p class="tableblock">Description</p></th>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>ECMAScript 5</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES5</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ES5 expressions, statements and declarations are fully supported (except scoping in with-statement) including type constraints and inference.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch most">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Import, Export</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">import statement fully supported, exporting declarations is supported, re-export not fully supported yet, no relative imports, no anonymous default export.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_scoping-and-access-restrictions"></a> Scoping and access restrictions</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>for..of loops</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Fully supported including destructuring.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Function scoping</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES5</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ES5-like function scoping with <code>var</code></p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Block scoping</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ES2015-like block scoping with <code>let</code> and <code>const</code></p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Constants</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">const variables (requiring initializers at declaration) with block scoping using keyword <code>const</code></p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Final fields</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">final fields (requiring initialization in constructor) with annotation <code>@Final</code></p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Access modifiers</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Access modifiers almost similar to Java: public, protected, private. Instead of
package, project is introduced limiting access to the current project or
component. For larger projects with components from multiple vendors, an additional modifier <code>@Internal</code> is
introduced to restrict access to vendor-types only.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>String templates</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ES2015-like string templates with validation (of expressions inside the template).</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_functions"></a> Functions</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Function objects</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Function (and method) expressions and declarations are modeled as function objects (with function type)</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Function subtyping</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java+ES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Override compatibility (similar to Java) with notion of ECMAScript semantics (superfluous or variadic parameters)</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Arrow expression</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Arrow functions with this binding according to ES2015</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Rest parameters</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Fully supported, parameters are treated as arrays inside function</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Optional parameters</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Parameters can be marked optional. This is going to be replaced with ES2015 default parameters.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Super calls</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Inside methods (of classes), super can be used to call overridden method (or constructor)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Generators</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Syntax supported but not supported by language (type checker) yet.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_declared-types"></a>  Declared types</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Classes</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015/Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class declarations as in ES2015 (or Java) with single inheritance but implementation of multiple interfaces as in Java)</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Interfaces</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Interface declarations with default methods (as in Java 8) and data fields (treated as default implementation, can be implemented with field accessors). <code>instanceof</code> operator can be used with interfaces as well.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Enumeration</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>&tilde; TS</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Simple enumerations with literals and basic reflection</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>String-based enums</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string based enumerations, literals are of type string</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Methods</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Methods as in ES2015, including constructor and static methods; overridden or implemented members are to be annotated with <code>@Override</code> as in Java</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch tbc">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Field accessors</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Getters and setters (in object literals and classes, instance and static); at the moment pairs are automatically recognized, will be changed to ES2015 semantics</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Data fields</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Instance and static fields including initializers as in Java</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Class modifiers</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">As in Java, classes can be declared abstract or final (using <code>@Final</code> annotation).</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch tbc">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_types"></a>  Types</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Type annotation</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type annotations using colon syntax similar to ECMAScript 4 proposal or TS, some special types use different syntax (will probably be adjusted to be compatible with TS)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>any</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">TS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Top type (super type of every other type), used as default type in N4JS files if no more specific type is declared or can be inferred. No property access is possible, since any has no properties. This is probably the most important difference to TypeScript: In TypeScript anything can be called on any, in N4JS nothing! However, this can be changed with a dynamic modifier, see below.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Primitives</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">primitive types as in ES5 (number, string, boolean), special types null and undefined (with special variant void to be used for return type)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch most">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>int</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">primitive type int, at the moment used synonymously to number, will be stricter checked and handled in future releases</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Symbols</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Built-in symbols are supported, dynamically created symbols are not supported yet.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Nominal types</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">By default, all subtyping is done nominally as in Java, i.e. subtype relations are to be explicitly declared with <code>extends</code> and <code>implements</code></p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Structural types</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>&tilde; TS</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Modifiers at declarations or references enable structural subtyping. Access modifiers are taken in to account, i.e. only public members become part of a structural type.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Field structural type</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Similar to structural typing, but only fields (data/accessors) are taken into account. Different variants (all fields, read-only fields/getter, write-only fields/setter, initializer variant for special constructor initializer) supported.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Static types</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">By default, only declared properties of a type can be accessed. This is true independent from the syntax (property access with dot-syntax <code>(a.x)</code> or index access <code>(a["x"])</code>. To model the map-behavior of Object, arbitrary index access on variables of type Object is allowed.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Dynamic types</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type modifier <code>+</code> enables arbitrary property access. Actually <code>any+</code> is similar to TypeScript&#8217;s any semantics. This is known to be unsafe, so it is not the default behavior (in particular not for any) but only to be used as an "escape hatch".</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Arrays</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Arrays are modeled as a generic type (extending Object)</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Object literals</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Object literals are modeled as structural types (\~Object with { properties })</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Type cast</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>&tilde; TS</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expressions can be explicitly casted to a type via <code>as</code></p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_generics"></a> Generics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Generic types</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Generic class and interface declarations, parameterized type references (raw type usage not allowed)</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Generic functions and methods</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Generic functions (and methods)</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Type variables, wildcards</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type variables (in declarations) and wildcards (in references) with upper and lower bounds&lt;/tr&gt;</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Type variable inference</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type variables are inferred if not explicitly bound by type arguments in the reference, this is particularly important for generic function/method calls. The type inference algorithm matches the Java 8 specification.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_type-constructors-and-special-types"></a>  Type Constructors and Special Types</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Union type</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>&tilde; TS</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">An union type defines that a variable (of that type) is subtype of (at least) one type defined in the union. Without further type checks, only members available in all types of the union are available. In case of methods, formal parameter types are merged by means of intersection types (and return types by means of union types)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Intersection type</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">TS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">An intersection type defines that a variable (of that type) is subtype of all types defined in the intersection. Thus, members defined in any type of the union are available. Property access to intersection types is not fully supported yet.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Constructor type</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>&tilde; TS</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type of a (non-abstract) class declaration or expression itself. Special subtyping rules are implemented, i.e. constructor signature is taking into account.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>type type</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type of a class or interface declaration, without any constructor. That is, variables of this type cannot be used in new-expressions. However, this type is useful in combination with static polymorphism.&lt;/tr&gt;</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>this type</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>&tilde; TS</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Type of the this-literal, can be used in combination with structural typing. Via annotation <code>@This</code> this type can be explicitly defined for functions.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Dynamic polyfills</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">In order to model the commonly used pattern of polyfills and to add new properties to built-in types (as in ES2015), dynamic polyfills can be defined (in definition modules only). They look like partial classes. The modules defining these polyfills may define (plain JS) modules which are to be executed at initialization time in order to apply the polyfills at runtime.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Static polyfills</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">In larger projects, often classes are automatically generated. In order to enrich these classes without changing the generator, static polyfills can be defined. The transpiler merges these static polyfills into the original modules.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_asynchronous-programming"></a>  Asynchronous Programming</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Promise</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Object type Promise as defined in ECMAScript 2015 defined as ES2015 API type</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Async/await</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES.next</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">async and await keywords for implicit promises, syntax and semantics closely follow <a href="https://tc39.github.io/ecmascript-asyncawait/">ES proposal</a>; transpiled to generator functions; validation checks correct usage of async await, async functions will implicitly return Promises. async can be used with function or method declarations, function and arrow expressions</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Promisifiable</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Via annotations <code>@Promisifiable</code> ES5-conform functions following code conventions for asynchronous callback parameters (last parameter is a callback function etc.) can be used as if they were defined with <code>async</code> keyword, i.e. they can be used with <code>await</code> keyword (or a promise can be retrieved via annotation <code>@Promisify</code>)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_components-and-modules"></a>  Components and Modules</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Components</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">N4JS and the N4JS IDE use the notion of components (or projects). An N4JS component is described with a manifest, in which the component and its dependencies are defined. N4JS introduces different component types: Runtime libraries and runtime environments define capabilities of specific JavaScript engines and execution environments (such as node.js vs. browser); test components have extended access to the tested components</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Modules</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">N4JS defines modules similar to ES2015, these modules are transpiled to V8-compatible JavaScript</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Type definition modules</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">TS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">In order to provide type annotations for existing projects, definition files (n4jsd) are used.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Module Loader</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES5/ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Unified output with support for <a href="https://github.com/systemjs/systemjs">System.js</a> and Common.js (<a href="https://nodejs.org/docs/latest/api/modules.html">Node.js implementation</a>) module loaders. Since System.js enables better handling of dependency cycles, this is the default loader used by the IDE</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Dependency Injection</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Dependency injection is supported using annotations similar to <a href="https://jcp.org/en/jsr/detail?id=330">JSR-330</a> (probably better known from <a href="https://github.com/google/guice">Guice</a>) and more to reduce client side glue code. Fields (and parameters) can be injected via <code>@Inject</code>, injectors can be easily set up via <code>@GenerateInjector</code> and configured with binders (and <code>@Bind annotation</code>). The built-in framework supports nesting of injectors, different injection points (field, constructor, method), providers and different scopes (default, singleton, injection-chain-singleton).</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_api"></a> API</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>ES5 object types</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All ECMAScript 5 object types are available in N4JS, type annotations are built-in</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch most">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>ES2015 object types</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">ES2015</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ECMAScript 2015 object types are defined by means of runtime libraries and a runtime environment. N4JS does not provide any implementation of these object types. Also, not all details are defined yet. This will be updated in future releases, depending also on V8 capabilities. However, the most important object types such as collections are defined already.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Reflection</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Besides ECMAScript reflection mechanisms, N4JS provides additional reflection at runtime via a built-in class N4Class. This class provides basic information at the moment, this will be improved in future releases</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_testing"></a> Testing</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>JUnit-like annotations</strong></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Java</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Tests can be annotated similar to <a href="http://junit.org/">JUnit</a>, i.e. tests methods with <code>@Test</code>, setup code with<code> @Before</code>/<code>@BeforeAll</code> etc.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Built-in Test Framework</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">An xUnit-like test framework "mangelhaft" using test annotations is provided with the IDE</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Extended Access</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test classes (in special test components) have extended access to tested projects, e.g., can access non-public members</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Test Execution</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Tests can be started from the IDE using node.js. It is possible to run single test modules, single methods, or whole packages/projets.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_node-js-support"></a> node.js Support</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Dynamic Import</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">In order to use projects without type annotations, the dynamic module import can be used to make the module dynamic (so that arbitrary properties can be accessed)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Automatic download of Type Definitions</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">If available, type definitions are automatically downloaded when an NPM module is installed via the IDE.
New type definitions will be added in the future.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Execution</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Modules can be run from the IDE using node.js, either using module loader System.js (default) or Common.js</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>npm Export</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Components an be exported to the file system, package.json is automatically created and content is organized according to NPM convention&#8201;&#8212;&#8201;ready to be published with NPM (which is not done automatically in order to avoid rash publications)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_n4js-ide-features"></a> N4JS IDE Features</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Syntax highlighting</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Syntax highlighting with special highlighting of type annotations, can be used for editing n4js, n4jsd or plain js files</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Immediate validation</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Code is validated as you type</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Incremental builder</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Code is transpiled as you save, only effected modules will be re-compiled</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch most">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Content assist</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Basic content assist (propose properties of the receiver, keywords) is working; will be improved in future releases</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Quickfixes</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Quick fixes to solve common issues, e.g. adding missing annotations or modifiers; more quickfixes will be added in future releases</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Wizards</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Wizards for creating new projects, classes or interfaces.
More wizards will be added in future releases</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Organize imports</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Automatically add missing imports and remove unused imports. A
lso content assist and quickfixes will add imports - you never have to type import statements.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Project and outline view</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Project view showing all components in workspace, (quick) outline view to easily navigate to declared elements.</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Jump to declaration</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Navigate from reference to bound declaration</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Find all references</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Find all references bound to a declaration</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Error reporting</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">We embrace bug reports! In order to enable easier writing of bug reports, language tests can be written inside the IDE.
This feature will be improved in the future.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Eclipse-powered</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Since the IDE is based on Eclipse, additional features such as git support are integrated or can easily be installed</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch most">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 14.2857%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="3"><a id="_n4js-headless-compiler"></a>  N4JS Headless Compiler</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>n4jsc</strong></p></td>
<td class="tableblock halign-center valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The headless compiler is workspace aware, i.e. it can compile all projects with a single command.
This makes it very easy to set up CI jobs. At the moment, the headless compiler is made available as a jar-file.
Additional support simplifying installation and usage will be added in future releases</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="_legend"><a class="link" href="#_legend">Legend</a></h2>
<div class="sectionbody">
<table class="tableblock frame-all grid-all stretch done">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="5">FeatureTable</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>green</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">available, although there might be bugs in the alpha-release.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch most">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>yellow</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">mostly available, some aspects or parts of the feature are not implemented yet or will be improved in the future.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch tbc">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>orange</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">feature available but syntax or semantics will be changed in future releases</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch tbd">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>red</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">planned for future releases but not implemented yet.</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="_references"><a class="link" href="#_references">References</a></h2>
<div class="sectionbody">
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top" colspan="5">References</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>ES</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock"><a href="http://www.ecma-international.org/ecma-262/5.1/">ECMAScript Language Specification</a> / ISO/IEC. Geneva, Switzerland, Juni 2011 (ECMA-262, 5.1 Edition)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>ES2015</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock"><a href="http://www.ecma-international.org/ecma-262/6.0/">ECMAScript 2015 Language Specification</a> / ISO/IEC (ECMA-262, 6th Edition). – International Standard.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>ES4</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Proposed ECMAScript 4th Edition – Language Overview / ECMA. – Proposal, <a href="http://www.ecmascript.org/es4/spec/overview.pdf">PDF</a>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>ES.next</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">ECMAScript proposals (ECMAScript 2017 or later or never)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>TS</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Hejlsberg, Anders ; Lucco, Steve: <a href="https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md">TypeScript Language Specification</a>. 1.8. Microsoft, Januar 2016.
<strong>&tilde; TS</strong> means very similar functionality.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Java</strong></p></td>
<td class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Gosling, James et al: <a href="https://docs.oracle.com/javase/specs/jls/se8/html/index.html">The Java Language Specification</a>. Java SE 8 Edition. JSR-337 Java SE 8 Release Contents.</p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
</div>
</div>
<div class="Grid social" style="color:#d5dfea">
  <div class="Cell Cell--2-12 m-Cell--withMargin">
    <h2>Quick Links</h2>
    <ul>
      <li><a href="../downloads.html">Download</a></li>
      <li><a href="../userguides/index.html">Documentation</a></li>
      <li><a href="https://github.com/eclipse/n4js/">Source</a></li>
      <li><a href="https://github.com/eclipse/n4js/issues">Issues</a></li>
    </ul>
  </div>
  <div class="Cell Cell--2-12 m-Cell--withMargin">
    <br/><br/>
    <ul>
      <li><a href="https://www.eclipse.org/forums/index.php/f/365/">Forum</a></li>
      <li><a href="http://n4js.blogspot.de/">Blog</a></li>
      <li><a href="https://dev.eclipse.org/mailman/listinfo/n4js-dev">Mailing List</a></li>
      <li><a href="https://projects.eclipse.org/projects/technology.n4js">Eclipse Project Page</a></li>
      <li><a href="https://twitter.com/n4jsdev">Tweets by n4jsdev</a></li>
    </ul>
  </div>
  <div class="Cell Cell--2-12 m-Cell--withMargin">
    <br/><br/>
    <ul>
      <li><a href="http://www.eclipse.org/">Eclipse Home</a></li>
      <li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
      <li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
      <li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
      <li><a href="http://www.eclipse.org/legal/">Legal</a></li>
    </ul>
  </div>
  <div style="clear: both; height: 0; overflow: hidden;"></div>
</div>

<script>
  // Toggle the table of contents
  $( "button#tocbutton" ).click(function() {
    if ($("#tocbutton").css('right') == '25px') {
      $( "#tocbutton" ).animate({right: '215px'},"slow");
      $( "#toc.toc2" ).animate({right: '0'},"slow");
  }
    else {
      $( "#tocbutton" ).animate({right: '25px'},"slow");
      $( "#toc.toc2" ).animate({right: '-13rem'},"slow");
  }
  });
</script>

<script type="text/javascript">
  // Create a back to top button
  $('body').prepend('<a href="#" class="back-to-top">Back to Top</a>');
  var amountScrolled = 300;
  $(window).scroll(function() {
  if ( $(window).scrollTop() > amountScrolled ) {
  	$('a.back-to-top').fadeIn('slow');
  } else {
  	$('a.back-to-top').fadeOut('slow');
  }
  });
  $('a.back-to-top, a.simple-back-to-top').click(function() {
  $('html, body').animate({
  	scrollTop: 0
  }, 700);
  return false;
  });
</script>
</body>
</html>